package com.example.service.impl;

import com.example.mapper.repairTestingMapp;
import com.example.pojo.repairBookPojo;
import com.example.pojo.repairTestingPojo;
import com.example.service.repairTestingService;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * ClassName:repairTestingImpl
 * Description:
 *
 * @Author 赵永峰
 * @Create 2024/5/15 9:52
 * @Version 1.0
 */
@Service//注解：表示把这个注入到了ben中。
@Slf4j
public class repairTestingImpl implements repairTestingService {
    @Autowired
    private repairTestingMapp repairTestingMapp;
    @Value("${file.upload-dir}")
    private String fileSaveLocation;
    public List<repairTestingPojo> repairTestingList(repairTestingPojo repairTestingPojo){
        //依据车间、作业指导书查询，这类的查询应该多，因此写成一个活动的，根据2个字段，查询所有的数据。
        List<repairTestingPojo> repairTestingPojoList =repairTestingMapp.byTowAll("workshopEnglish","taksNameEnglish",repairTestingPojo.getWorkshopEnglish(),repairTestingPojo.getTaksNameEnglish());

        return repairTestingPojoList;
    }
    //对“检测标准”中传来的文件进行保存

    public void TestingModifySteps(String tableDataTempJson, List<MultipartFile> fileListV){
        //定义一个图片文件名的字符串，记录保存的文件名。
        String fileNameAll="";
        // 定义文件保存的目录（这里假设是服务器的/Server目录）
//       String saveDir = "D:\\new\\Server\\";
        String saveDir=fileSaveLocation;
        try{
            //把接收到的字符串数据更换为对象
            repairTestingPojo tableDataTemp = new ObjectMapper().readValue(tableDataTempJson,repairTestingPojo.class);
            log.info("看看有没有id",tableDataTemp.getFrequency());
            //把传递出来的数据，不需要修改的文件名记录下来
            String fileNameB=tableDataTemp.getFileNameAll();
            //根据传入的ID，把数据库中原来的文件记录信息找出来，作为对比是否是一个重复的文件。
            String fileNameAllOld= repairTestingMapp.lookUpId(tableDataTemp.getId(),"fileNameAll");
            //第一步：首先实现文件删除功能
            if (fileNameAllOld!=null){
                //识别出那个文件需要删除，把老的图片文件名信息中需要保留的信息删除掉。
                String deleteFile=fileNameAllOld.replace(tableDataTemp.getFileNameAll(),"");
                if (deleteFile!=""){
                    String[] deleteFileItem=deleteFile.split("\\|\\*\\|");
                    //循环，对需要删除的文件进行删除。
                    for (int i = 0; i < deleteFileItem.length; i++) {
                        // 构建文件的完整路径
                        String filePath = saveDir + File.separator + deleteFileItem[i];
                        //创建需要删除的这个文件
                        File file = new File(filePath);
                        //检查文件是否存在,存在的时候进行操作，不存在就不处理了
                        if(file.exists()){
                            // 检查是否是文件而不是目录，如果是目录，就不处理了。
                            if (file.isFile()) {
                                // 检查是否有删除权限,有修改权限的时候才进行删除，没有权限就不处理了
                                if (file.canWrite()) {
                                    //删除文件
                                    boolean isDeleted = file.delete();
                                    if (isDeleted) {
                                        log.info("删除成功，文件名是：{}",filePath);
                                    } else {
                                        log.info("删除识别，需要删除的文件是：{}",filePath);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            //第二步：对新加入的文件进行更新，保存。
            if (fileListV != null && !fileListV.isEmpty()) {
                File dir = new File(saveDir);
                // 如果目录不存在，则创建它
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                // 遍历文件列表并保存每个文件
                for (MultipartFile file : fileListV) {
                    if (!file.isEmpty()) {
                        try {
                            // 生成文件的唯一名称以避免冲突
                            String fileName = UUID.randomUUID()+"&&"+file.getOriginalFilename();
                            String filePath = saveDir + fileName;
                            File dest = new File(filePath);
                            // 将文件保存到服务器上的指定位置
                            file.transferTo(dest);
                            fileNameAll=fileNameAll+fileName+"|*|";
                        } catch (IOException e) {
                            throw new RuntimeException("文件保存失败：" + e.getMessage());
                        }
                    }
                }
            } else {
                log.warn("没有接收到文件");
            }
            //组合新的数据库信息,只写入文件名的数据，其他不写入。
            tableDataTemp.setFileNameAll(fileNameB+fileNameAll);
            tableDataTemp.setUpdateTime(LocalDateTime.now());
            repairTestingMapp.updateOnlyFileName(tableDataTemp);
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    //修改检测标准中的数据,不能保存图片信息，要是保存就乱了
    public void TestingModifyStepsString(repairTestingPojo repairTestingPojo){
        repairTestingPojo.setUpdateTime(LocalDateTime.now());
        repairTestingMapp.UpdateNoFileList(repairTestingPojo);
    }
}
